const { app, BrowserWindow, ipcMain, nativeTheme } = require('electron')
const path = require('path')

let mainWindow
// 注册协议 让浏览器可以唤起软件
const protocol = 'zhufeng'
const scheme = `${protocol}://`
app.setAsDefaultProtocolClient(protocol)

let urlParams = {}
handleSchemeWakeup(process.argv)

// 只有第一个运行的实例才返回true
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
  // 限制不允许启动多个实例
  app.quit()
} else {
  // 在第一实例里监听第二实例运行
  app.on('second-instance', (event, argv) => {
    // 从最小化窗口回复
    mainWindow.restore()
    // 从后台显示
    mainWindow.show()
    handleSchemeWakeup(argv)
  })
}
// mac监听唤起软件
app.on('open-url', (event, url) => handleSchemeWakeup(url))

app.whenReady().then(() => {
  createWindow()
})
// 进程之间的通信一般使用异步的形式 同步会阻塞整个渲染进程
ipcMain.handle('isDarkMode', (event, args) => {
  return nativeTheme.shouldUseDarkColors
})
ipcMain.on('setTheme', (event, theme) => {
  nativeTheme.themeSource = theme
})

function createWindow() {
  const width = parseInt(urlParams.width) || 800
  const heigth = parseInt(urlParams.height) || 600
  if (mainWindow) {
    mainWindow.setSize(width, heigth)
  } else {
    mainWindow = new BrowserWindow({
      width,
      heigth,
      webPreferences: {
        nodeIntegration: false, // 开启node.js环境集成风险比较大
        sandbox: false, // 关闭沙箱不然preload中使用nodeapi报错
        preload: path.join(__dirname, '../preload/index.js'), // 在prelaod中访问node大api
        // contextIsolation: true // 上下文隔离默认开启 关闭后preload和index.html共享window对象
      }
    })
    // loadFile/loadURL会产生render进程
    // mac上活动监视器上有10个render进程，我觉得应该是有加载路径和内容的iframe会添加一个进程
    mainWindow.loadURL('https://www.w3schools.com/html/tryit.asp?filename=tryhtml_iframe_height_width')
    mainWindow.webContents.openDevTools()
  }
}

function handleSchemeWakeup(argv) {
  // windows没有open-url事件
  const url = [].concat(argv).find((v) => v.startsWith(scheme))
  if (!url) return
  const searchParams = new URLSearchParams(url.slice(scheme.length))
  urlParams = Object.fromEntries(searchParams.entries())
  if (app.isReady()) createWindow()
}